package leetcode;

import java.util.ArrayList;
import java.util.List;

/**
 * @创建人 mby381
 * @创建时间 2022/3/15
 * @描述
 */
public class Solution54 {
    public List<Integer> spiralOrder(int[][] matrix) {
        int xtag = matrix[0].length;
        int ytag = matrix.length;
        int track = 2 * Math.min(xtag, ytag) - 1;
        int step = xtag - 1;
        List<Integer> li = new ArrayList<>();
        int dir = 0;
        int x = 0;
        int y = 0;
        if (xtag == 1) {
            for (int i = 0; i < ytag; i++) {
                li.add(matrix[i][0]);
            }
            return li;
        }
        if (ytag == 1) {
            for (int j = 0; j < xtag; j++) {
                li.add(matrix[0][j]);
            }
            return li;
        }
        for (int i = 0; i < track; i++) {
            for (int j = 0; j < step; j++) {
                li.add(matrix[y][x]);
                switch (dir) {
                    case 0:
                        x++;
                        break;
                    case 1:
                        y++;
                        break;
                    case 2:
                        x--;
                        break;
                    case 3:
                        y--;
                        break;
                }
            }
            if (dir % 2 == 0) {
                step = ytag - 1;
                ytag--;
            } else {
                step = xtag - 1;
                xtag--;
            }
            dir = (dir + 1) % 4;
        }
        step++;
        switch (dir) {
            case 0:
                for (int j = 0; j < step; j++) {
                    li.add(matrix[y][x]);
                    x++;
                }
                break;
            case 1:
                for (int j = 0; j < step; j++) {
                    li.add(matrix[y][x]);
                    y++;
                }
                break;
            case 2:
                for (int j = 0; j < step; j++) {
                    li.add(matrix[y][x]);
                    x--;
                }
                break;
            case 3:
                for (int j = 0; j < step; j++) {
                    li.add(matrix[y][x]);
                    y--;
                }
                break;
        }
        return li;
    }
}

